import request from "@/utils/request";
import cache from "@/utils/cache";
import {decryptByDES} from "@/utils/utils";

export default {
  namespaced: true,
  state() {
    return {
      user: {},
    }
  },

  mutations: {
    // 同步状态管理
    toggleUser(state, res) {
      state.user = {...res}
    },

    // 清楚状态管理
    clearUser(state) {
      state.user = {}
    }
  },

  actions: {
    async logout(context) {
      // 发起异步请求,服务器段会token打入黑名单中
      const res = await request.post("/auth/logout");
      // 如果执行成功，把本地的session缓存和状态全部清楚
      if (res.status == 200) {
        // 清楚本地缓存
        cache.session.remove("token");
        cache.session.remove("nickname");
        cache.session.remove("userId");
        cache.session.remove("vuex");
        // 清楚状态管理
        context.commit("clearUser");
        // 清楚状态管理的菜单。跨模块清除 在vuex状态管理的根目录找到菜单menu状态管理模块的方法clearMenu进行清楚
        context.commit('menu/clearMenu', null, {root: true});
        // 退出执行逻辑
        return Promise.resolve(true);
      }
    },

    // 登录逻辑
    async logined(context, logininfo) {
      try {
        // 1: 异步执行. res就是服务器请求的信息
        const res = await request.post("/auth/login/pwd", logininfo);
        // 2：如果请求成功就是200
        if (res.status == 200) {
          // 3: 获取服务器段返回的数据信息
          const {token, userId, nickname} = res.data;
          // 4: 把服务器段信息放入到session中
          cache.session.set("token", token);
          cache.session.set("nickname", nickname);
          cache.session.set("userId", userId);
          // 状态管理  res.data 是服务端返回的所有的用户信息，包括角色列表和权限列表
          context.commit("toggleUser", res.data);
          // 为什么返回承诺promise,
          return Promise.resolve(res.data);
        } else {
          return Promise.reject(res);
        }
      } catch (err) {
        alert("服务器忙...");
      }
    }
  },

  // 数据加工在再造处理
  getters: {
    // 判断是否登录
    isLogin: state => {
      return state.user.userId;
    },

    // 角色列表
    rolename: state => {
      return state.user.roleList.map(role => role.name).join(",")
    },

    // 角色列表ids
    roleids: state => {
      return state.user.roleList.map(role => role.id).join(",")
    },

    // 权限列表
    permissons: state => {
      return state.user.permissionList.map(per => ({id: per.id, name: per.name, code: per.code, url: per.url}));
    },

    permissionObj: state => {
      // 这里是从状态管理获取
      var permissionsList = state.user.permissionList;
      var permissionObj = {};
      permissionsList.forEach(obj => {
        permissionObj[decryptByDES(obj.code)] = obj;
      })
      return permissionObj;
    }
  }
}
